import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
import { dataType } from 'element-plus/es/components/table-v2/src/common'
import { showMessage } from './status'
import { IResponse } from './type'
import { getToken, clearToken, TokenKey as tokenKey, TokenPrefix as tokenPrefix, Tokensuffix as tokenSuffix } from '/@/utils/auth'

import {ElMessage} from 'element-plus'; // 消息通知
import { ElMessageBox } from 'element-plus' // 消息弹框

import router from "/@/router"; // 路由跳转


// 如果请求话费了超过 `timeout` 的时间，请求将被中断
axios.defaults.timeout = 5000
// 表示跨域请求时是否需要使用凭证
axios.defaults.withCredentials = false
// axios.defaults.headers.common['token'] =  AUTH_TOKEN
// 允许跨域
axios.defaults.headers.post['Access-Control-Allow-Origin-Type'] = '*';

axios.defaults.headers.common[tokenKey] = ''; // accesstoken 

const axiosInstance: AxiosInstance = axios.create({
  baseURL:  import.meta.env.VITE_APP_API_BASEURL + '', // import.meta.env.BASE_URL + '', 
  // transformRequest: [
  //   function (data) {
  //     //由于使用的 form-data传数据所以要格式化
  //     delete data.Authorization
  //     data = qs.stringify(data)
  //     return data
  //   },
  // ],
})


// axios实例拦截响应
axiosInstance.interceptors.response.use(
  (response: AxiosResponse) => {
    // if (response.headers.authorization) {
    //   localStorage.setItem('app_token', response.headers.authorization)
    // } else if (response.data && response.data.token) {
    //   localStorage.setItem('app_token', response.data.token)
    // }

    if (response.status === 200) {
      return response
    }
    showMessage(response.status)
    return response
  },
  // 请求失败
  (error: any) => {
    const { response } = error
    if (response) {
      // 请求已发出，但是不在2xx的范围
      showMessage(response.status)
      return Promise.reject(response.data)
    }
    showMessage('网络连接异常,请稍后再试!')
  },
)

// axios实例拦截请求
axiosInstance.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    const token = getToken()
    if (token) {
      if(!config.headers){
        config.headers = { };
      }
      config.headers.accesstoken = `${tokenPrefix}${token}${tokenSuffix}`; // header 里添加 accesstoken
    }
    return config
  },
  (error: any) => {
    return Promise.reject(error)
  },
)

const request = <T = any>(config: AxiosRequestConfig): Promise<T> => {
  const conf = config
  return new Promise((resolve) => {
    axiosInstance
      .request<any, AxiosResponse<IResponse>>(conf)
      .then((res: AxiosResponse<IResponse>) => {
        // resolve(res as unknown as Promise<T>);
        
        const {
          data: { result },
        } = res
        // if(res.status != 200 || res.status != 204 ) { //  axiosInstance.interceptors.response.use 已经做了拦截
        
        if( !res.data.isSuccess ) { // 没有返回数据
          if(res.data.code === 'E0006') { // 

            ElMessageBox.confirm('登录凭证已失效，是否重新登入', '重新登录', {
              confirmButtonText: '重新登录',
              cancelButtonText: '取消',
              type: 'warning'
            }).then(() => { // 重新登录
              console.log('res.data');

              clearToken();
              router.push({ name: "login" });
            })
          } else {

            ElMessage({
              type: 'error',
              message: res.data.message,
            })
            // ElMessageBox.alert(res.data.message, '', {
            //   confirmButtonText: 'OK',
            // })

          }
          // console.log('res.data');
          // console.log(res.data);
          // ElMessage.error(res.data);
        }
        else {

          resolve(result as T);
        }

      })
  })
}

// const request = <T = any>(config: AxiosRequestConfig, options?: AxiosRequestConfig): Promise<T> => {
//   if (typeof config === 'string') {
//     if (!options) {
//       return axiosInstance.request<T, T>({
//         url: config,
//       });
//       // throw new Error('请配置正确的请求参数');
//     } else {
//       return axiosInstance.request<T, T>({
//         url: config,
//         ...options,
//       });
//     }
//   } else {
//     return axiosInstance.request<T, T>(config);
//   }
// };

export function get<T = any>(config: AxiosRequestConfig): Promise<T> {
  return request({ ...config, method: 'GET' })
}

export function post<T = any>(config: AxiosRequestConfig): Promise<T> {
  return request({ ...config, method: 'POST' })
}

export default request
export type { AxiosInstance, AxiosResponse }
